package com.atguigu.springcloud.service;

import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.IdUtil;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.PathVariable;

/**
 * @Author csc
 * @Date 2023/3/18 0018 14:08
 * @Version 1.0
 */
@Service
public class PaymentService
{

     public String paymentInfo_ok(Integer id){
         return "线程池: "+Thread.currentThread().getName() +"  paymentInfo_ok,id:"+id+"\t哈哈哈";
     }//end

    @HystrixCommand(fallbackMethod = "paymentInfo_TimeOutHandler",commandProperties = {
            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000")
    })
    public String paymentInfo_TimeOut(Integer id){
         int timeNumer = 5;
        ThreadUtil.sleep(timeNumer * 1000);
        //int age = 10/0;
        return "线程池: "+Thread.currentThread().getName() +"  paymentInfo_TimeOut,id:"+id+"\t哭了";
    }//end

    public String paymentInfo_TimeOutHandler(Integer id){
        return "服务超时,别调用了";
    }//end


   //===========服务熔断
   @HystrixCommand(fallbackMethod = "circuitBreaker_fallback",commandProperties = {
           @HystrixProperty(name = "circuitBreaker.enabled",value = "true"),//是否开启熔断器
           @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10"),//请求次数
           @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"),//时间窗口期
           @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60"),//失败率达到多少后跳闸

   })
   public String paymentCircuitBreaker(@PathVariable("id") Integer id){
            if(id<0){
                throw  new RuntimeException("******id 不能为负数");
            }
            String serialNumber = IdUtil.simpleUUID();
            return Thread.currentThread().getName()+"\t"+"调用成功,流水号:"+serialNumber;
    }//end paymentCircuitBreaker


    //服务降级,提供的备用方法
    public  String circuitBreaker_fallback(@PathVariable("id") Integer id){
          return "id 不能负数,请稍后再试";
    }//end









}
